/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package projetbi_extraction;

// Java standard + POI
//import com.sun.xml.internal.ws.util.StringUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.Iterator;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
import projetbi_dao.DAOCollaborateur;
import projetbi_dao.DAOCompetenceFonctionnelle;
import projetbi_dao.DAOCompetenceTechnique;
import projetbi_dao.DAODiplome;
import projetbi_dao.DAODomaineCompetence;
import projetbi_dao.DAOLangueCollaborateur;
import projetbi_objets.OClient;
import projetbi_objets.OCollaborateur;
import projetbi_objets.OCompetenceFonctionnelle;
import projetbi_objets.OCompetenceTechnique;
import projetbi_objets.ODiplome;
import projetbi_objets.ODomaineCompetence;
import projetbi_objets.OEnvTechMission;
import projetbi_objets.OFonction;
import projetbi_objets.OLangueCollaborateur;
import projetbi_objets.OSuiviEtPositionnement;

// Nos classes
import tools.DocxListCreator;
import static tools.DocxListCreator.getExtension;
import projetbi_parsing.StringPatternMatching;

/**
 * Projet BI - M2 FIC 2012-2013
 *
 * @author Jef, Tuan-Long, William, Mohamed
 */
public class ProcessEachFile {

    public ProcessEachFile() {
    }

    // Méthode qui va traiter un CV tout entier et le mettre en base.
    public void processFullCV(String filePath) throws InterruptedException {
        StringPatternMatching spm = new StringPatternMatching();

        // Déclaration des différents objets
        OCollaborateur oc = new OCollaborateur();
        ArrayList<OLangueCollaborateur> olanguesc = new ArrayList();
        ArrayList<ODiplome> odipl = new ArrayList();
        ArrayList<OCompetenceFonctionnelle> ocompetF = new ArrayList();
        ArrayList<OCompetenceTechnique> ocompetT = new ArrayList();
        ArrayList<ODomaineCompetence> odomC = new ArrayList();

        // Remplissage des objets, un à un
        oc = processCollaborateur(filePath);
        olanguesc = processLanguesCollaborateur(filePath);
        odipl = processDiplomes(filePath);
        ocompetF = processCompetencesFonctionnelles(filePath);
        ocompetT = processCompetencesTechniques(filePath);
        odomC = processDomainesCompetences(filePath);



        // Insertion des premiers objets dans la base
        DAOCollaborateur daOCollaborateur = new DAOCollaborateur();

        // Récupération du bon id pour le collaborateur
        OCollaborateur ocRes = daOCollaborateur.create(oc);
        // Ligne de test, à virer
        //System.out.println("--------- ocRes.getIdCollaborateur() : " + ocRes.getIdCollaborateur());

        // Insertion des objets liés au collaborateur et actualisation de l'id
        // OLangueCollaborateur
        DAOLangueCollaborateur daOLangueCollaborateur = new DAOLangueCollaborateur();
        Iterator<OLangueCollaborateur> iter_1olc = olanguesc.iterator();
        while (iter_1olc.hasNext()) {
            OLangueCollaborateur o1olc_tmp = iter_1olc.next();
            o1olc_tmp.setIdCollaborateur(ocRes.getIdCollaborateur());
            daOLangueCollaborateur.create(o1olc_tmp);
        }
        // ODiplome
        DAODiplome daODiplome = new DAODiplome();
        Iterator<ODiplome> iter_1od = odipl.iterator();
        while (iter_1od.hasNext()) {
            ODiplome o1od_tmp = iter_1od.next();
            o1od_tmp.setIdCollaborateur(ocRes.getIdCollaborateur());
            daODiplome.create(o1od_tmp);
        }
        // OCompetenceFonctionnelle
        DAOCompetenceFonctionnelle daOCompetenceFonctionnelle = new DAOCompetenceFonctionnelle();
        Iterator<OCompetenceFonctionnelle> iter_1ocfct = ocompetF.iterator();
        while (iter_1ocfct.hasNext()) {
            OCompetenceFonctionnelle o1ocf_tmp = iter_1ocfct.next();
            o1ocf_tmp.setIdCollaborateur(ocRes.getIdCollaborateur());
            daOCompetenceFonctionnelle.create(o1ocf_tmp);
        }
        // OCompetenceTechnique
        DAOCompetenceTechnique daOCompetenceTechnique = new DAOCompetenceTechnique();
        Iterator<OCompetenceTechnique> iter_1octct = ocompetT.iterator();
        while (iter_1octct.hasNext()) {
            OCompetenceTechnique o1oct_tmp = iter_1octct.next();
            o1oct_tmp.setIdCollaborateur(ocRes.getIdCollaborateur());
            daOCompetenceTechnique.create(o1oct_tmp);
        }
        // ODomaineCompetence
        DAODomaineCompetence daODomaineCompetence = new DAODomaineCompetence();
        Iterator<ODomaineCompetence> iter_1odc = odomC.iterator();
        while (iter_1odc.hasNext()) {
            ODomaineCompetence o1odc_tmp = iter_1odc.next();
            o1odc_tmp.setIdCollaborateur(ocRes.getIdCollaborateur());
            daODomaineCompetence.create(o1odc_tmp);
        }

        // Table de fait
        injectLignesTDF(filePath, ocRes.getIdCollaborateur());
    }

    // Crée le collaborateur
    public OCollaborateur processCollaborateur(String entryText) {
        OCollaborateur oc = new OCollaborateur();
        oc = processCollaborateurBasicFields(entryText);

        return (oc);
    }

    // Créé la liste des compétences fonctionnelles
    public ArrayList<OCompetenceFonctionnelle> processCompetencesFonctionnelles(String entryText) {
        ArrayList<OCompetenceFonctionnelle> ocf = new ArrayList();
        StringPatternMatching spm = new StringPatternMatching();

        String lignesCFBrut = spm.spm_getS4OCompetencesFonctionnelles_Macro(entryText);

        // Ligne de test, à virer
        //System.out.println("--------- lignesCFBrut : " + lignesCFBrut);

        // Découpage des compétences fonctionnelles
        String[] compFCoupees;
        String delimiter1 = new String(";");
        compFCoupees = lignesCFBrut.split(delimiter1);

        for (int i = 0; i < compFCoupees.length; i++) {
            if (!compFCoupees[i].equals("")) {
                ocf.add(spm.spm_createOCompetenceFonctionnelle(compFCoupees[i].replace("\n", "")
                        .replace("\r", "")));
            }
        }

        return (ocf);
    }

    // Créé la liste des compétences techniques
    public ArrayList<OCompetenceTechnique> processCompetencesTechniques(String entryText) {
        ArrayList<OCompetenceTechnique> oct = new ArrayList();
        StringPatternMatching spm = new StringPatternMatching();

        String lignesCTBrut = spm.spm_getS4OCompetencesTechniques_Macro(entryText);

        // Ligne de test, à virer
        //System.out.println("--------- lignesCTBrut : " + lignesCTBrut);

        // Découpage des compétences techniques
        String[] compTCoupees;
        String delimiter1 = new String(";");
        compTCoupees = lignesCTBrut.split(delimiter1);

        for (int i = 0; i < compTCoupees.length; i++) {
            if (!compTCoupees[i].equals("")
                    && !compTCoupees[i].contains("Environnements")
                    && !compTCoupees[i].contains("Bureautique")
                    && !compTCoupees[i].contains("SGBD")
                    && !compTCoupees[i].contains("Langages")
                    && !compTCoupees[i].contains("Outils décisionnels")
                    && !compTCoupees[i].contains("Outils décisonnels")) {
                // Il y avait une faute sur "décisonnels" dans le document de base...
                oct.add(spm.spm_createOCompetenceTechnique(compTCoupees[i].replace("\n", "")
                        .replace("\r", "")));
            }
        }

        return (oct);
    }

    // Créé la liste des domaines de compétence
    public ArrayList<ODomaineCompetence> processDomainesCompetences(String entryText) {
        ArrayList<ODomaineCompetence> odc = new ArrayList();
        StringPatternMatching spm = new StringPatternMatching();

        String lignesDCBrut = spm.spm_getS4ODomainesCompetences_Macro(entryText);

        // Ligne de test, à virer
        //System.out.println("--------- lignesCFBrut : " + lignesCFBrut);

        // Découpage des domaines de compétences
        String[] dCompCoupes;
        String delimiter1 = new String(";");
        dCompCoupes = lignesDCBrut.split(delimiter1);

        for (int i = 0; i < dCompCoupes.length; i++) {
            if (!dCompCoupes[i].equals("")) {
                odc.add(spm.spm_createODomaineCompetence(dCompCoupes[i].replace("\n", "")
                        .replace("\r", "")));
            }
        }

        return (odc);
    }

    // Créé la liste des lignes pour la table de fait, et tous les objets
    // qui vont avec. Méthode très importante.
    public void injectLignesTDF(String entryText, int idCol) {
        String olTDF = new String();
        String oNomsMissions = new String();
        StringPatternMatching spm = new StringPatternMatching();

        // Récupération des strings bruts, avant découpage
        olTDF = spm.spm_getS4LignesTDF_Macro(entryText);
        oNomsMissions = spm.spm_getS4NomsMissions_Macro(entryText);

        // Ligne de test, à virer
        //System.out.println("--------- oNomsMissions : " + oNomsMissions);

        // Découpage des différentes missions
        String[] missionsCoupees;
        String delimiter1 = new String("Projet");
        missionsCoupees = olTDF.split(delimiter1);

        // Découpage des informations relatives aux missions
        String[] nomsMissionsCoupes;
        String delimiterNM1 = new String("__");
        nomsMissionsCoupes = oNomsMissions.split(delimiterNM1);

        // Ligne de test, à virer
        //System.out.println("--------- nomsMissionsCoupes[0] : " + nomsMissionsCoupes[0]);
        //System.out.println("--------- missionsCoupees[0] : " + missionsCoupees[0]);
        //System.out.println("--------- nomsMissionsCoupes[1] : " + nomsMissionsCoupes[1]);
        //System.out.println("--------- missionsCoupees[1] : " + missionsCoupees[1]);

        // Création des objets, les lignes de la table de fait étant
        // en dernier
        for (int i = 0; i < missionsCoupees.length; i++) {
            if (!missionsCoupees[i].equals("")) {
                spm.spm_creerEtInjecterUneLigneTDF(missionsCoupees[i], nomsMissionsCoupes[i], idCol);
            }
        }

    }

    // Créé une liste de langues parlées par le collaborateur
    public ArrayList<OLangueCollaborateur> processLanguesCollaborateur(String entryText) {
        ArrayList<OLangueCollaborateur> olc = new ArrayList();
        StringPatternMatching spm = new StringPatternMatching();

        //int countLanguesCollaborateur = 0;
        String lignesLanguesBrut = spm.spm_getS4OLanguesCollaborateur_Macro(entryText);
        //countLanguesCollaborateur = (lignesLanguesBrut.length() - lignesLanguesBrut.replace(":", "").length());

        // Ligne de test, à virer
        //System.out.println("--------- LignesLanguesBrut : " + lignesLanguesBrut);

        // Découpage des langues
        String[] languesCoupees;
        String delimiter1 = new String("\\t");
        languesCoupees = lignesLanguesBrut.split(delimiter1);

        for (int i = 0; i < languesCoupees.length; i++) {
            if (!languesCoupees[i].equals("")) {
                olc.add(spm.spm_createOLangueCollaborateur(languesCoupees[i].replace("\n", "")
                        .replace("\r", "")));
            }
        }
        return (olc);
    }

    // Trouve et remplit les champs de base du collaborateur
    public OCollaborateur processCollaborateurBasicFields(String entryText) {
        OCollaborateur res = new OCollaborateur();
        StringPatternMatching spm = new StringPatternMatching();

        res.setIdCollaborateur(0);
        String[] nomEtPrenom = spm.spm_getS4OCollaborateur_NomPrenom(entryText);
        res.setPrenom(nomEtPrenom[0].replaceAll("\\s", ""));
        res.setNom(nomEtPrenom[1].replaceAll("\\s", ""));

        // Ligne de test, à virer
        //System.out.println("Prénom et nom : " + res.getPrenom() + " " + res.getNom());

        // Remplissage des champs pour voir
        res.setAnneesExp(spm.spm_getI4OCollaborateur_AnneesExp(entryText));
        res.setDateDeNaissance(new Date());
        res.setDisponibilite(spm.spm_getI4OCollaborateur_Disponibilite(entryText));
        res.setSecteurActivite(spm.spm_getI4OCollaborateur_SecteurActivite(entryText));
        res.setTitreProfil(spm.spm_getS4OCollaborateur_TitreProfil(entryText));

        return res;
    }

    private int getNumberOfDiplomes(String entryText) {
        return (entryText.length() - entryText.replace(":", "").length());
    }

    public ArrayList<ODiplome> processDiplomes(String entryText) {
        //int diplomeCount = 0;
        //diplomeCount = getNumberOfDiplomes(entryText);
        ArrayList<ODiplome> od = new ArrayList();
        StringPatternMatching spm = new StringPatternMatching();

        String lignesDiplomeBrut = spm.spm_getS4ODiplome_Macro(entryText);

        // Ligne de test, à virer
        //System.out.println("--------- lignesDiplomeBrut : " + lignesDiplomeBrut);

        // Découpage des diplômes
        String[] diplomesCoupes;
        String delimiter1 = new String("\\t");
        diplomesCoupes = lignesDiplomeBrut.split(delimiter1);

        for (int i = 0; i < diplomesCoupes.length; i++) {
            if (!diplomesCoupes[i].equals("")) {
                od.add(spm.spm_createODiplome(diplomesCoupes[i].replace("\n", "")
                        .replace("\r", "")));
            }
        }

        return (od);
    }
    // Ordre de création des objets :
    // 1 - ******************************** Collaborateur ( regroupe d'autres objets )
    // 2 - LanguesCollaborateur
    // 3 - DomaineCompétence
    // 4 - CompetenceFonctionnelle
    // 5 - CompetenceTechnique
    // 6 - Diplômes
    // 7 -  ******************************* SuiviEtPositionnement ( regroupe d'autres objets )
    // 8 - FormationMission 
    // 9 - TechnoFormation
    // 10 - AptitudeFormation 
    // 11 - EnvTechMission
    // 12 - Client
    // 13 - Fonction
    /*
     * 
     * -------------------------------------------------------
     * 
     */
    // Ordre d'insertion des objets en base :
    // 1 - Diplômes
    // 2 - LanguesCollaborateur
    // 3 - DomaineCompétence
    // 4 - CompetenceFonctionnelle
    // 5 - CompetenceTechnique
    // 6 - ******************************** Collaborateur ( regroupe d'autres objets )
    // 7 - AptitudeFormation
    // 8 - TechnoFormation
    // 9 - FormationMission
    // 10 - Fonction
    // 11 - EnvTechMission
    // 12 - Client
    // 13 - ******************************* SuiviEtPositionnement ( regroupe d'autres objets )
}
